/**
 * 全局错误处理中间件
 * @param {Object} err 错误对象
 * @param {Object} req 请求对象
 * @param {Object} res 响应对象
 * @param {Function} next 下一步函数
 */
const errorHandler = (err, req, res, next) => {
  // 默认错误信息
  let statusCode = 500;
  let message = '服务器内部错误';
  let code = 500;

  // 打印详细的错误信息
  console.error('=== 详细错误信息 ===');
  console.error('错误对象:', err);
  console.error('错误消息:', err.message);
  console.error('错误堆栈:', err.stack);
  console.error('请求URL:', req.url);
  console.error('请求方法:', req.method);
  console.error('====================');

  // 根据错误类型设置不同的响应
  if (err.name === 'ValidationError') {
    // Mongoose验证错误
    statusCode = 400;
    code = 400;
    message = '数据验证失败';
  } else if (err.name === 'JsonWebTokenError') {
    // JWT错误
    statusCode = 401;
    code = 401;
    message = '无效的访问令牌';
  } else if (err.name === 'TokenExpiredError') {
    // JWT过期错误
    statusCode = 401;
    code = 401;
    message = '访问令牌已过期';
  } else if (err.code === 'ER_DUP_ENTRY') {
    // MySQL唯一约束错误
    statusCode = 400;
    code = 400;
    message = '数据已存在';
  } else if (err.code === 'ECONNREFUSED') {
    // 数据库连接错误
    statusCode = 500;
    code = 500;
    message = '数据库连接失败，请检查数据库服务是否启动';
  } else if (err.message) {
    // 使用自定义错误信息
    message = err.message;
  }

  // 在开发环境中返回详细的错误信息
  if (process.env.NODE_ENV === 'development') {
    console.error('Error:', err);
  }

  // 发送错误响应
  res.status(statusCode).json({
    code,
    message,
    ...(process.env.NODE_ENV === 'development' && { stack: err.stack })
  });
};

module.exports = errorHandler;